Integral Numérica - Método de Simpson Composto
Usaremos o Método de Simpson Composto para o cálculo da áreas de funções.
Método de Simpson Composto
A regra de Simpson baseia-se em aproximar a integral definida pela área sob arcos de parábola que interpolam a função. Origem: Wikipédia
Formulação do Método
n:Intervalos Igualmente Espaçados> OBS:A medida que o valor de n aumenta a integração de f(x) tende ao valor real
$$h = \dfrac{x_m - x_0}{n}$$
$$\int_{a}^{b} f(x) \,dx \approx \dfrac{1}{3}h\{[f(x_0) + f(x_m)] +4[f(x_1)+ $$ $$ f(x_3) + \dots + f(x_{m-1})] + 2[f(x_2) + f(x_4)+ \dots + f(x_{m-2}) ]\}$$
ou
$${\displaystyle {\begin{aligned}\int _{a}^{b}f(x)\,dx&\approx {\frac {h}{3}}\sum _{j=1}^{n/2}{\big [}f(x_{2j-2})+4f(x_{2j-1})+f(x_{2j}){\big ]}\\&={\frac {h}{3}}{\bigg [}f(x_{0})+2\sum _{j=1}^{n/2-1}f(x_{2j})+4\sum _{j=1}^{n/2}f(x_{2j-1})+f(x_{n}){\bigg ]},\end{aligned}}}$$
import numpy as np
def metodo_simpson(f, x_0, x_m, n):
# O passo de integração, n é a quantidade de subintervalos que queremos.
# veridicando se [n] é PAR, condição necessária para o método simpson.
if (n%2 != 0):
n -= 1
h = (x_m - x_0)/ float(n)
f_x0 = f(x_0)
f_xm = f(x_m)
x = x_0
x += h
index = 1
somatorio = 0.0
while (x < x_m):
if (index%2 != 0):
somatorio += 4*f(x)
else:
somatorio += 2*f(x)
index += 1
x += h
integral = (h /3.0)*(f_x0 + f_xm + somatorio)
print('\n***************************'+'\033[1m'+ ' SAÍDA ' + '\033[0m'+'***************************\n')
print(f"\tIntegral ≈ {integral}")
print(f"\tSubintervalos [n] = {n}")
print(f"\tPasso [h] = {h}")
print(f"\tLimite Inferior [x_0] = {x_0}")
print(f"\tLimite Superior [x_m] = {x_m}")
print("\n*************************************************************\n")
Exemplo 01
Aplicando o Método de Simpsom Composto ao exemplo abaixo, temos:
$$\int_{x_0}^{x_m} 2x-e^x \,dx$$
$$\int_{-1}^{2} 2x-e^x \,dx \approx \dfrac{1}{3}h\{[2x_0-e^{x_0} + 2x_m-e^{x_m}] + $$
$$4[2x_1-e^{x_1} + 2x_3-e^{x_3} + \dots + 2x_{m-1}-e^{x_{m-1}}] + $$
$$2[2x_2-e^{x_2} + 2x_4-e^{x_4}+ \dots + 2x_{m-2}-e^{x_{m-2}} ]\}$$
Código
f = lambda x: 2*x-np.exp(x)
# Resolvendo a integral usando o método de simpson composto
x_0 = 0; x_m = 2; n = 10
metodo_simpson(f, x_0, x_m, n)
Código
f = lambda x: np.cos(x)
# Resolvendo a integral usando o método de simpson composto
x_0 = 0; x_m = 2; n = 10
metodo_simpson(f, x_0, x_m, n)
Código
f = lambda x: x**2
# Resolvendo a integral usando o método de simpson composto
x_0 = 0; x_m = 2; n = 10
metodo_simpson(f, x_0, x_m, n)